<!DOCTYPE html>
<html lang="en">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>GCC 4.5 Release Series &mdash; Changes, New Features, and Fixes</title>
<link rel="stylesheet" type="text/css" href="https://gcc.gnu.org/gcc.css" />
</head>

<!-- GCC maintainers, please do not hesitate to update/contribute entries
     concerning those part of GCC you maintain!  2002-03-23, Gerald.
-->

<body>
<h1>GCC 4.5 Release Series<br />Changes, New Features, and Fixes</h1>

<h2>Caveats</h2>

  <ul>
    <li id="mpccaveat">GCC now requires the <a
    href="https://www.multiprecision.org/mpc/">MPC</a> library in order to
    build.  See the <a
    href="https://gcc.gnu.org/install/prerequisites.html">prerequisites
    page</a> for version requirements.</li>

    <li><p>Support for a number of older systems and recently
    unmaintained or untested target ports of GCC has been declared
    obsolete in GCC 4.5.  Unless there is activity to revive them, the
    next release of GCC will have their sources permanently
    <strong>removed</strong>.</p>

    <p id="obsoleted">The following ports for individual systems on
    particular architectures have been obsoleted:</p>

    <ul>
      <li>IRIX releases before 6.5 (mips-sgi-irix5*,
	mips-sgi-irix6.[0-4])</li>
      <li>Solaris 7 (*-*-solaris2.7)</li>
      <li>Tru64 UNIX releases before V5.1 (alpha*-dec-osf4*,
	alpha-dec-osf5.0*)</li>
      <li>Details for the IRIX, Solaris 7, and Tru64 UNIX obsoletions can
	be found in the <a
	href="https://gcc.gnu.org/ml/gcc/2010-01/msg00510.html">announcement</a>.</li>
    </ul>

    <p>Support for the classic POWER architecture implemented
    in the original RIOS and RIOS2 processors of the old IBM RS/6000
    product line has been obsoleted in the rs6000 port.  This does not
    affect the new generation Power and PowerPC architectures.</p>

    </li>

    <li>Support has been removed for all the 
    <a href="../gcc-4.4/changes.html#obsoleted">configurations obsoleted
    in GCC 4.4</a>.</li>

    <li>Support has been removed for the <code>protoize</code>
    and <code>unprotoize</code> utilities, obsoleted in GCC 4.4.</li>

    <li>Support has been removed for tuning for Itanium1 (Merced) variants.
    Note that code tuned for Itanium2 should also run correctly on Itanium1.</li>

    <li>GCC now generates unwind info also for epilogues.  DWARF debuginfo
    generated by GCC now uses more features of DWARF3 than before, and
    also some DWARF4 features.  GDB older than 7.0 is not able to
    handle either of these, so to debug GCC 4.5 generated binaries or
    libraries GDB 7.0 or later is needed.  You can disable use of DWARF4
    features with the <code>-gdwarf-3 -gstrict-dwarf</code> options, or
    use <code>-gdwarf-2 -gstrict-dwarf</code> to restrict GCC to just
    DWARF2, but epilogue unwind info is emitted unconditionally whenever
    unwind info is emitted.</li>

    <li>On x86 targets, code containing floating-point calculations may
    run significantly more slowly when compiled with GCC 4.5 in strict C99
    conformance mode than they did with earlier GCC versions. This is due
    to stricter standard conformance of the compiler and can be avoided by
    using the option <code>-fexcess-precision=fast</code>; also see
    <a href="#x86">below</a>.</li>

    <li>The function attribute <code>noinline</code> no longer prevents GCC
    from cloning the function.  A new attribute <code>noclone</code>
    has been introduced for this purpose.  Cloning a function means
    that it is duplicated and the new copy is specialized for certain
    contexts (for example when a parameter is a known constant).</li>
 </ul>

<h2>General Optimizer Improvements</h2>

  <ul>

    <li>The <code>-save-temps</code> now takes an optional argument.  The
    <code>-save-temps</code> and <code>-save-temps=cwd</code> switches write
    the temporary files in the current working directory based on the original
    source file.  The <code>-save-temps=obj</code> switch will write files into
    the directory specified with the <code>-o</code> option, and the
    intermediate filenames are based on the output file.  This will allow the
    user to get the compiler intermediate files when doing parallel builds
    without two builds of the same filename located in different directories
    from interfering with each other.</li>

    <li>Debugging dumps are now created in the same directory as the
    object file rather than in the current working directory.  This
    allows the user to get debugging dumps when doing parallel builds
    without two builds of the same filename interfering with each other.</li>

    <li id="mpcopts">GCC has been integrated with the MPC library. This
    allows GCC to evaluate complex arithmetic at compile time <a
    href="https://gcc.gnu.org/PR30789">more
    accurately</a>.  It also allows GCC to evaluate calls to complex
    built-in math functions having constant arguments and replace them
    at compile time with their mathematically equivalent results.  In
    doing so, GCC can generate correct results regardless of the math
    library implementation or floating point precision of the host
    platform.  This also allows GCC to generate identical results
    regardless of whether one compiles in native or cross-compile
    configurations to a particular target.  The following built-in
    functions take advantage of this new capability:
    <code>cacos</code>, <code>cacosh</code>, <code>casin</code>,
    <code>casinh</code>, <code>catan</code>, <code>catanh</code>,
    <code>ccos</code>, <code>ccosh</code>, <code>cexp</code>,
    <code>clog</code>, <code>cpow</code>, <code>csin</code>,
    <code>csinh</code>, <code>csqrt</code>, <code>ctan</code>, and
    <code>ctanh</code>.  The <code>float</code> and <code>long
    double</code> variants of these functions (e.g. <code>csinf</code>
    and <code>csinl</code>) are also handled.</li>

    <li>A new link-time optimizer has been added (<code><a
    href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801"
    >-flto</a></code>).
    When this option is used, GCC generates a bytecode representation of
    each input file and writes it to specially-named sections in each
    object file.  When the object files are linked together, all the
    function bodies are read from these named sections and instantiated
    as if they had been part of the same translation unit.  This
    enables interprocedural optimizations to work across different
    files (and even different languages), potentially improving the
    performance of the generated code. To use the link-timer optimizer,
    <code>-flto</code> needs to be specified at compile time and during
    the final link. If the program does not require any symbols to be
    exported, it is possible to combine <code>-flto</code> and the
    experimental <code><a
    href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhopr-802"
    >-fwhopr</a></code> with <code><a
    href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhole_002dprogram-800"
    >-fwhole-program</a></code> to allow the interprocedural optimizers
    to use more aggressive assumptions.</li>

    <li>The automatic parallelization pass was enhanced to support 
    parallelization of outer loops.</li>

    <li>Automatic parallelization can be enabled as part of Graphite.
    In addition to <code>-ftree-parallelize-loops=</code>, specify 
    <code>-floop-parallelize-all</code> to enable the Graphite-based 
    optimization.</li>

    <li>The infrastructure for optimizing based on
    <a href="https://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html">restrict qualified pointers</a>
    has been rewritten and should result in code generation improvements.
    Optimizations based on restrict qualified pointers are now also available
    when using <code>-fno-strict-aliasing</code>.</li>

    <li>There is a new optimization pass that attempts to change prototype
    of functions to avoid unused parameters, pass only relevant parts of
    structures and turn arguments passed by reference to arguments passed
    by value when possible. It is enabled by <code>-O2</code> and above
    as well as <code>-Os</code> and can be manually invoked using the new
    command-line switch <code>-fipa-sra</code>.  </li>

    <li>GCC now optimize exception handling code. In particular cleanup
    regions that are proved to not have any effect are optimized out.</li>
  </ul>

<h2>New Languages and Language specific improvements</h2>

<h3>All languages</h3>
  <ul>
    <li>The <code>-fshow-column</code> option is now on by default.  This 
    means error messages now have a column associated with them.</li>
  </ul>

<h3>Ada</h3>

  <ul>
    <li>Compilation of programs heavily using discriminated record types
    with variant parts has been sped up and generates more compact code.</li>
    <li>Stack checking now works reasonably well on most plaforms.  In
    some specific cases, stack overflows may still fail to be detected,
    but a compile-time warning will be issued for these cases.</li>
  </ul>

<h3>C family</h3>

  <ul>
    <li>If a header named in a <code>#include</code> directive is not
    found, the compiler exits immediately.  This avoids a cascade of
    errors arising from declarations expected to be found in that
    header being missing.</li>
    <li>A new built-in function <code>__builtin_unreachable()</code>
    has been added that tells the compiler that control will never
    reach that point.  It may be used after <code>asm</code>
    statements that terminate by transferring control elsewhere, and
    in other places that are known to be unreachable.</li>
    <li>The <code>-Wlogical-op</code> option now warns for logical
    expressions such as <code>(c == 1 &amp;&amp; c == 2)</code> and <code>(c
    != 1 || c != 2)</code>, which are likely to be mistakes. This
    option is disabled by default.</li>
    <li>An <code>asm goto</code> feature has been added to
    allow <code>asm</code> statements that jump to C labels.</li>
    <li>C++0x raw strings are supported for C++ and for C
    with <code>-std=gnu99</code>.</li>
    <li>The <code>deprecated</code> attribute now takes an optional
    string argument, for example,
    <code>__attribute__((deprecated("text string")))</code>, that will
    be printed together with the deprecation warning.</li>

  </ul>

<h3>C</h3>
  <ul>
    <li>The <code>-Wenum-compare</code> option, which warns when
    comparing values of different enum types, now works for C.  It
    formerly only worked for C++.  This warning is enabled
    by <code>-Wall</code>.  It may be avoided by using a
    type cast.</li>
    <li>The <code>-Wcast-qual</code> option now warns about casts
    which are unsafe in that they permit const-correctness to be
    violated without further warnings.  Specifically, it warns about
    cases where a qualifier is added when all the lower types are
    not <code>const</code>.  For example, it warns about a cast
    from <code>char **</code> to <code>const char **</code>.</li>
    <li>The <code>-Wc++-compat</code> option is significantly
    improved.  It issues new warnings for:
      <ul>
	<li>Using C++ reserved operator names as identifiers.</li>
	<li>Conversions to enum types without explicit casts.</li>
	<li>Using va_arg with an enum type.</li>
	<li>Using different enum types in the two branches
	of <code>?:</code>.</li>
	<li>Using <code>++</code> or <code>--</code> on a variable of
	enum type.</li>
	<li>Using the same name as both a struct, union or enum tag
	and a typedef, unless the typedef refers to the tagged type
	itself.</li>
	<li>Using a struct, union, or enum which is defined within
	another struct or union.</li>
	<li>A struct field defined using a typedef if there is a field
	in the struct, or an enclosing struct, whose name is the
	typedef name.</li>
	<li>Duplicate definitions at file scope.</li>
	<li>Uninitialized const variables.</li>
	<li>A global variable with an anonymous struct, union, or enum
	type.</li>
	<li>Using a string constant to initialize a char array whose
	size is the length of the string.</li>
      </ul></li>
    <li>The new <code>-Wjump-misses-init</code> option warns about
    cases where a <code>goto</code> or <code>switch</code> skips the
    initialization of a variable.  This sort of branch is an error in
    C++ but not in C.  This warning is enabled
    by <code>-Wc++-compat</code>.</li>
    <li>GCC now ensures that a
    C99-conforming <code>&lt;stdint.h&gt;</code> is present on most
    targets, and uses information about the types in this header to
    implement the Fortran bindings to those types.  GCC does not
    ensure the presence of such a header, and does not implement the
    Fortran bindings, on the following targets: NetBSD, VxWorks, VMS,
    SymbianOS, WinCE, LynxOS, Netware, QNX, Interix, TPF.</li>
    <li>GCC now implements C90- and C99-conforming rules for constant
    expressions.  This may cause warnings or errors for some code
    using expressions that can be folded to a constant but are not
    constant expressions as defined by ISO C.</li>
    <li>All known target-independent C90 and C90 Amendment 1
    conformance bugs, and all known target-independent C99 conformance
    bugs not related to floating point or extended identifiers, have
    been fixed.</li>
    <li>The C decimal floating point support now includes support for
    the <code>FLOAT_CONST_DECIMAL64</code> pragma.</li>
    <li>The named address space feature from ISO/IEC TR 18037 is now
    supported.  This is currently only implemented for the SPU
    processor.</li>
  </ul>

<h3 id="cplusplus">C++</h3>
  <ul>
    <li>Improved <a href="cxx0x_status.html">experimental support for the
    upcoming C++0x</a> ISO C++ standard, including support for raw strings,
    lambda expressions and <code>explicit</code> type conversion
    operators.</li>

    <li>When printing the name of a class template specialization, G++ will
    now omit any template arguments which come from default template
    arguments. This behavior (and the pretty-printing of function template
    specializations as template signature and arguments) can be disabled
    with the <code>-fno-pretty-templates</code> option.</li>

    <li>Access control is now applied to <code>typedef</code> names used in
    a template, which may cause G++ to reject some ill-formed code that was
    accepted by earlier releases.  The <code>-fno-access-control</code>
    option can be used as a temporary workaround until the code is
    corrected.</li>

    <li>Compilation time for code that uses templates should now scale
      linearly with the number of instantiations rather than quadratically,
      as template instantiations are now looked up using hash tables.</li>

    <li>Declarations of functions that look like builtin declarations of
      library functions are only considered to be redeclarations if they
      are declared with extern &quot;C&quot;.  This may cause problems with
      code that omits extern &quot;C&quot; on hand-written declarations of
      C library functions such as <code>abort</code>
      or <code>memcpy</code>.  Such code is ill-formed, but was accepted by
      earlier releases.</li>

    <li>Diagnostics that used to complain about passing non-POD types to
      <code>...</code> or jumping past the declaration of a non-POD
      variable now check for triviality rather than PODness, as per
      C++0x.</li>

    <li>In C++0x mode local and anonymous classes are now allowed as
      template arguments, and in declarations of variables and functions
      with linkage, so long as any such declaration that is used is also
      defined (<a 
      href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#757"
      >DR 757</a>).</li>

    <li>Labels may now have attributes, as has been permitted for a
    while in C.  This is only permitted when the label definition and
    the attribute specifier is followed by a semicolon&mdash;i.e., the
    label applies to an empty statement.  The only useful attribute
    for a label is <code>unused</code>.</li>

    <li>
      G++ now implements 
      <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176">DR
	176</a>.  Previously G++ did not support using the
      injected-class-name of a template base class as a type name, and
      lookup of the name found the declaration of the template in the
      enclosing scope.  Now lookup of the name finds the
      injected-class-name, which can be used either as a type or as a
      template, depending on whether or not the name is followed by a
      template argument list.  As a result of this change, some code that
      was previously accepted may be ill-formed because
      <ol>
	<li>The injected-class-name is not accessible because it's from a
	  private base, or</li>
	<li>The injected-class-name cannot be used as an argument for a
	  template template parameter.</li>
      </ol>
      In either of these cases, the code can be fixed by adding a
      nested-name-specifier to explicitly name the template.  The first can
      be worked around with <code>-fno-access-control</code>; the second is
      only rejected with <code>-pedantic</code>.
    </li>

    <li>A new standard mangling for SIMD vector types has been added, to
      avoid name clashes on systems with vectors of varying length.  By
      default the compiler still uses the old mangling, but emits aliases
      with the new mangling on targets that support strong aliases.  Users
      can switch over entirely to the new mangling
      with <code>-fabi-version=4</code> or <code>-fabi-version=0</code>.
      <code>-Wabi</code> will now warn about code that uses the old
      mangling.</li>

    <li>The command-line option <code>-ftemplate-depth-N</code> is now
      written as <code>-ftemplate-depth=N</code> and the old form is
      deprecated.</li>

      <li>Conversions between <code>NULL</code> and non-pointer types
      are now warned by default. The new option
      <code>-Wno-conversion-null</code> disables these warnings.
      Previously these warnings were only available when using
      <code>-Wconversion</code> explicitly.</li>
      
  </ul>  
  <h4>Runtime Library (libstdc++)</h4>

  <ul>
    <li>Improved experimental support for the upcoming ISO C++ standard, 
	C++0x, including:
      <ul>
      <li>Support for &lt;future&gt;, &lt;functional&gt;, 
	and &lt;random&gt;.</li>
      <li>Existing facilities now exploit explicit operators and the
	newly implemented core C++0x features.</li>
      <li>The header &lt;cstdatomic&gt; has been renamed to &lt;atomic&gt;.</li>
      </ul>
    </li>

    <li>
<p>An experimental <a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/profile_mode.html">
    profile mode </a> has been added. This is an implementation of
    many C++ standard library constructs with an additional analysis
    layer that gives performance improvement advice based on
    recognition of suboptimal usage patterns. For example,
</p>

<pre>
#include &lt;vector&gt;
int main() 
{
  std::vector&lt;int&gt; v;
  for (int k = 0; k &lt; 1024; ++k) 
    v.insert(v.begin(), k);
}
</pre>

<p>
When instrumented via the profile mode, can return suggestions about
the initial size and choice of the container used as follows:
</p>

<pre>
vector-to-list: improvement = 5: call stack = 0x804842c ...
    : advice = change std::vector to std::list
vector-size: improvement = 3: call stack = 0x804842c ...
    : advice = change initial container size from 0 to 1024
</pre>

<p>
These constructs can be substituted for the normal libstdc++
constructs on a piecemeal basis, or all existing components can be
transformed via the <code>-D_GLIBCXX_PROFILE</code> macro.
</p>
</li>

    <li><a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr24733">Support for decimal floating-point arithmetic</a>
    (aka ISO C++ TR 24733) has been added. This support is in header file
    <code>&lt;decimal/decimal&gt;</code>, uses namespace
    <code>std::decimal</code>, and includes classes <code>decimal32</code>,
    <code>decimal64</code>, and <code>decimal128</code>.</li>

    <li>Sources have been audited for application of function attributes
    <code>nothrow</code>, <code>const</code>, <code>pure</code>, and
    <code>noreturn</code>.</li>

    <li>Python pretty-printers have been added for many standard
    library components that simplify the internal representation and
    present a more intuitive view of components when used with
    appropriately-advanced versions of GDB. For more information,
    please consult the
    more <a href="https://sourceware.org/gdb/wiki/STLSupport">detailed
    description</a>.</li>

    <li>The default behavior for comparing typeinfo names has changed,
    so in <code>&lt;typeinfo&gt;</code>,
    <code>__GXX_MERGED_TYPEINFO_NAMES</code> now defaults to zero.</li>

    <li>The new <code>-static-libstdc++</code> option
    directs <code>g++</code> to link the C++ library statically, even
    if the default would normally be to link it dynamically.</li>
  </ul>

<h3 id="Fortran">Fortran</h3>
  <ul>
    <li>The <code>COMMON</code> default padding has been changed &ndash;
    instead of adding the padding before a variable it is now added
    afterwards, which increases the compatibility with other vendors
    and helps to obtain the correct output in some cases. Cf. also the
    <code>-falign-commons</code> option (<a href="../gcc-4.4/changes.html">added
    in 4.4</a>).</li>

    <li>The <code>-finit-real=</code> option now also supports the value
    <code>snan</code> for signaling not-a-number; to be effective,
    one additionally needs to enable trapping (e.g. via
    <code>-ffpe-trap=</code>). Note: Compile-time optimizations can
    turn a signaling NaN into a quiet one.</li>

    <li>The new option <code>-fcheck=</code> has been added with the
    options <code>bounds</code>, <code>array-temps</code>,
    <code>do</code>, <code>pointer</code>, and <code>recursive</code>. The
    <code>bounds</code> and <code>array-temps</code> options are
    equivalent to <code>-fbounds-check</code> and
    <code>-fcheck-array-temporaries</code>. The <code>do</code>
    option checks for invalid modification of loop iteration variables,
    and the <code>recursive</code> option tests for recursive calls
    to subroutines/functions which are not marked as recursive. With
    <code>pointer</code> pointer association checks in calls are performed;
    however, neither undefined pointers nor pointers in expressions are
    handled. Using <code>-fcheck=all</code> enables all these run-time
    checks.</li>

    <li>The run-time checking <code>-fcheck=bounds</code> now warns
    about invalid string lengths of character dummy arguments. Additionally,
    more compile-time checks have been added.</li>

    <li>The new option <a
    href="https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html"
    ><code>-fno-protect-parens</code></a> has been added; if set, the
    compiler may reorder REAL and COMPLEX expressions without regard
    to parentheses.</li>

    <li>GNU Fortran no longer links against <code>libgfortranbegin</code>.
    As before, <code>MAIN__</code> (assembler symbol name) is the actual
    Fortran main program, which is invoked by the <code>main</code> function.
    However, <code>main</code> is now generated and put in the same object
    file as <code>MAIN__</code>. For the time being,
    <code>libgfortranbegin</code> still exists for backward
    compatibility. For details see the new <a
    href="https://gcc.gnu.org/onlinedocs/gfortran/Mixed_002dLanguage-Programming.html">Mixed-Language
    Programming</a> chapter in the manual.</li>

    <li>The I/O library was restructured for performance and cleaner
    code.</li>

    <li>Array assignments and <code>WHERE</code> are now run in parallel when
    OpenMP's <code>WORKSHARE</code> is used.</li>

    <li>The experimental option <code>-fwhole-file</code> was added. The option
    allows whole-file checking of procedure arguments and allows for better
    optimizations. It can also be used with <code>-fwhole-program</code>,
    which is now also supported in gfortran.</li>

    <li>More Fortran 2003 and Fortran 2008 mathematical functions can
    now be used as initialization expressions.</li>
    <li>Some extended attributes such as <code>STDCALL</code> are now
    supported via the <a
    href="https://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html">
    <code>GCC$</code> compiler directive</a>.</li>
    <li>For Fortran 77 compatibility: If <code>-fno-sign-zero</code> is
    used, the <code>SIGN</code> intrinsic behaves now as if zero were always
    positive.</li>
    <li>For legacy compatibiliy: On Cygwin and MinGW, the special files
    <code>CONOUT$</code> and <code>CONIN$</code> (and <code>CONERR$</code>
    which maps to <code>CONOUT$</code>) are now supported.</li>

    <li>Fortran 2003 support has been extended:
      <ul>
       <li>Procedure-pointer function results and procedure-pointer
       components (including PASS),</li>
       <li>allocatable scalars (experimental),</li>
       <li><code>DEFERRED</code> type-bound procedures,</li>
       <li>the <code>ERRMSG=</code> argument of the <code>ALLOCATE</code>
       and <code>DEALLOCATE</code> statements have been implemented.</li>
       <li>The <code>ALLOCATE</code> statement supports type-specs and
       the <code>SOURCE=</code> argument.</li>
       <li><code>OPERATOR(*)</code> and <code>ASSIGNMENT(=)</code> are now
       allowed as <code>GENERIC</code> type-bound procedure (i.e. as
       type-bound operators).</li>
       <li>Rounding (<code>ROUND=</code>, <code>RZ</code>, ...) for output
       is now supported.</li>
       <li>The <code>INT_FAST{8,16,32,64,128}_T</code> kind type parameters
       of the intrinsic module <code>ISO_C_BINDING</code> are now
       supported, except for the targets listed above as ones where
       GCC does not have <code>&lt;stdint.h&gt;</code> type information.
       </li>
       <li>Extensible derived types with type-bound procedure or procedure
       pointer with <code>PASS</code> attribute now have to use
       <code>CLASS</code> in line with the Fortran 2003 standard; the
       workaround to use <code>TYPE</code> is no longer supported.</li>
       <li><a href="https://gcc.gnu.org/wiki/OOP">Experimental, incomplete
       support for polymorphism</a>, including <code>CLASS</code>,
       <code>SELECT TYPE</code> and dynamic dispatch of type-bound
       procedure calls. Some features do not work yet such as
       unlimited polymorphism (<code>CLASS(*)</code>).</li>
      </ul>
    </li>

    <li>Fortran 2008 support has been extended:
      <ul>
        <li>The <code>OPEN</code> statement now supports the
        <code>NEWUNIT=</code> option, which returns a unique file unit,
        thus preventing inadvertent use of the same unit in different parts
        of the program.</li>
        <li>Support for unlimited format items has been added.</li>
        <li>The <code>INT{8,16,32}</code> and <code>REAL{32,64,128}</code>
        kind type parameters of the intrinsic module
        <code>ISO_FORTRAN_ENV</code> are now supported.</li>
        <li>Using complex arguments with <code>TAN</code>, <code>SINH</code>,
        <code>COSH</code>, <code>TANH</code>, <code>ASIN</code>,
        <code>ACOS</code>, and <code>ATAN</code> is now possible; the
        functions <code>ASINH</code>, <code>ACOSH</code>, and
        <code>ATANH</code> have been added (for real and complex arguments)
        and <code>ATAN(Y,X)</code> is now an alias for <code>ATAN2(Y,X).</code>
       </li>
       <li>The <code>BLOCK</code> construct has been implemented.</li>
      </ul>
    </li>
  </ul>

<h2 id="targets">New Targets and Target Specific Improvements</h2>

<h3>AIX</h3>
  <ul>
    <li>Full cross-toolchain support now available with GNU Binutils</li>
  </ul>

<h3>ARM</h3>
  <ul>
    <li>GCC now supports the Cortex-M0 and Cortex-A5 processors.</li>
    <li>GCC now supports the ARM v7E-M architecture.</li>
    <li>GCC now supports VFPv4-based FPUs and FPUs with
    single-precision-only VFP.</li>
    <li>GCC has many improvements to optimization for other ARM
    processors, including scheduling support for the integer pipeline
    on Cortex-A9.</li>
    <li>GCC now supports the IEEE 754-2008 half-precision
    floating-point type, and a variant ARM-specific half-precision
    type.  This type is specified using <code>__fp16</code>, with the
    layout determined by <code>-mfp16-format</code>.  With
    appropriate <code>-mfpu</code> options, the Cortex-A9 and VFPv4
    half-precision instructions will be used.</li>
    <li>GCC now supports the variant of AAPCS that uses VFP registers
    for parameter passing and return values.</li>
  </ul>

<h3>AVR</h3>
  <ul>
    <li>The <code>-mno-tablejump</code> option has been removed because it
    has the same effect as the <code>-fno-jump-tables</code> option.</li>
    <li>Added support for these new AVR devices:
      <ul>
        <li>ATmega8U2</li>
        <li>ATmega16U2</li>
        <li>ATmega32U2</li>
      </ul>
    </li>
  </ul>

<h3 id="x86">IA-32/x86-64</h3>
  <ul>
    <li>GCC now will set the default for <code>-march=</code> based on
    the configure target.</li>
    <li>GCC now supports handling floating-point excess precision
    arising from use of the x87 floating-point unit in a way that
    conforms to ISO C99.  This is enabled
    with <code>-fexcess-precision=standard</code> and with standards
    conformance options such as <code>-std=c99</code>, and may be
    disabled using <code>-fexcess-precision=fast</code>.</li>
    <li>Support for the Intel Atom processor is now available through the
        <code>-march=atom</code> and <code>-mtune=atom</code> options.</li>
    <li>A new <code>-mcrc32</code> option is now available to enable
    <code>crc32</code> intrinsics.</li>
    <li>A new <code>-mmovbe</code> option is now available to enable GCC
    to use the <code>movbe</code> instruction to implement
    <code>__builtin_bswap32</code> and <code>__builtin_bswap64</code>.
    </li>
    <li>SSE math now can be enabled by default at configure time with the
    new <code>--with-fpmath=sse</code> option.</li>
    <li>There is a new intrinsic header file, &lt;x86intrin.h&gt;. It
    should be included before using any IA-32/x86-64 intrinsics.</li>
    <li>Support for the XOP, FMA4, and LWP instruction sets for the AMD
    Orochi processors are now available with
    the <code>-mxop</code>, <code>-mfma4</code>,
    and <code>-mlwp</code> options.</li>
    <li>The <code>-mabm</code> option enables GCC to use
    the <code>popcnt</code> and <code>lzcnt</code> instructions on AMD
    processors.</li>
    <li>The <code>-mpopcnt</code> option enables GCC to use
    the <code>popcnt</code> instructions on both AMD and Intel
    processors.</li>
  </ul>

<h3>M68K/ColdFire</h3>
  <ul>
    <li>GCC now supports ColdFire 51xx, 5221x,  5225x, 52274, 52277,
    5301x and 5441x devices.</li>
    <li>GCC now supports thread-local storage (TLS) on M68K and
    ColdFire processors.</li>
  </ul>

<h3 id="mep">MeP</h3>

<p>Support has been added for the Toshiba Media embedded Processor (MeP, or
mep-elf) embedded target.</p>

<h3>MIPS</h3>
  <ul>
    <li>GCC now supports MIPS 1004K processors.</li>
    <li>GCC can now be configured with
    options <code>--with-arch-32</code>, <code>--with-arch-64</code>,
    <code>--with-tune-32</code> and <code>--with-tune-64</code> to
    control the default optimization separately for 32-bit and 64-bit
    modes.</li>
    <li>MIPS targets now support an alternative <code>_mcount</code> interface,
    in which register <code>$12</code> points to the function's save slot
    for register <code>$31</code>.  This interface is selected by the
    <code>-mcount-ra-address</code> option; see the documentation for
    more details.</li>
    <li>GNU/Linux targets can now generate read-only <code>.eh_frame</code>
    sections.  This optimization requires GNU binutils 2.20 or above, and
    is only available if GCC is configured with a suitable version of
    binutils.</li>
    <li>GNU/Linux targets can now attach special relocations to indirect
    calls, so that the linker can turn them into direct jumps or branches.
    This optimization requires GNU binutils 2.20 or later, and is
    automatically selected if GCC is configured with an appropriate
    version of binutils.  It can be explicitly enabled or disabled
    using the <code>-mrelax-pic-calls</code> command-line option.</li>
    <li>GCC now generates more heavily-optimized atomic operations on
    Octeon processors.</li>
    <li>MIPS targets now support the <code>-fstack-protector</code> option.</li>
    <li>GCC now supports an <code>-msynci</code> option, which specifies
    that <code>synci</code> is enough to flush the instruction cache,
    without help from the operating system.  GCC uses this information
    to optimize automatically-generated cache flush operations, such as
    those used for nested functions in C.  There is also a
    <code>--with-synci</code> configure-time option, which makes
    <code>-msynci</code> the default.</li>
    <li>GCC supports four new function attributes for interrupt
    handlers: <code>interrupt</code>, <code>use_shadow_register_set</code>,
    <code>keep_interrupts_masked</code> and
    <code>use_debug_exception_return</code>.  See the documentation
    for more details about these attributes.</li>
  </ul>

<h3 id="rs6000">RS/6000 (POWER/PowerPC)</h3>
  <ul>
    <li>GCC now supports the Power ISA 2.06, which includes the VSX
        instructions that add vector 64-bit floating point support, new population
        count instructions, and conversions between floating point and unsigned types.</li>
    <li>Support for the power7 processor is now available through the
        <code>-mcpu=power7</code> and <code>-mtune=power7</code>.</li>
    <li>GCC will now vectorize loops that contain simple math functions like copysign
        when generating code for altivec or VSX targets.</li>
    <li>Support for the A2 processor is now available through the
        <code>-mcpu=a2</code> and <code>-mtune=a2</code> options.</li>
    <li>Support for the 476 processor is now available through the
        <code>-mcpu={476,476fp}</code> and <code>-mtune={476,476fp}</code>
        options.</li>
    <li>Support for the e500mc64 processor is now available through
        the <code>-mcpu=e500mc64</code>
        and <code>-mtune=e500mc64</code> options.</li>
    <li>GCC can now be configured with
    options <code>--with-cpu-32</code>, <code>--with-cpu-64</code>,
    <code>--with-tune-32</code> and <code>--with-tune-64</code> to
    control the default optimization separately for 32-bit and 64-bit
    modes.</li>

    <li>Starting with GCC 4.5.4, vectors of type <i>vector long long</i> or
      <i>vector long</i> are passed and returned in the same method as other
      vectors with the VSX instruction set.  Previously the GCC compiler did
      not adhere to the ABI for 128-bit vectors with 64-bit integer base
      types (PR 48857).  This is also fixed in the GCC 4.6.1 release.</li>
  </ul>

<h3 id="rx">RX</h3>

<p>Support has been added for the Renesas RX Processor (rx-elf) target.</p>

<h2 id="os">Operating Systems</h2>

<h3 id="windows">Windows (Cygwin and MinGW)</h3>
  <ul>
    <li>GCC now installs all the major language runtime libraries as DLLs
    when configured with the <code>--enable-shared</code> option.</li>
    <li>GCC now makes use of the new support for aligned common variables in
    versions of binutils &gt;= 2.20 to fix bugs in the support for SSE data
    types.</li>
    <li>Improvements to the libffi support library increase the reliability
    of code generated by GCJ on all Windows platforms.  Libgcj is enabled
    by default for the first time.</li>
    <li>Libtool improvements simplify installation by placing the generated
    DLLs in the correct binaries directory.</li>
    <li>Numerous other minor bugfixes and improvements, and substantial
    enhancements to the Fortran language support library.</li>
  </ul>

<!--
<h2>Documentation improvements</h2>
-->
>

<h2>Other significant improvements</h2>

<h3>Plugins</h3>
  <ul>
    <li>It is now possible to extend the compiler without having to
    modify its source code.  A new option <code>-fplugin=file.so</code>
    tells GCC to load the shared object <code>file.so</code> and execute
    it as part of the compiler.  The internal documentation describes
    the details on how plugins can interact with the compiler.</li>
  </ul>

<h3>Installation changes</h3>

  <ul>
    <li>
    The move to newer autotools changed default installation directories
    and switches to control them:

    The <code>--with-datarootdir</code>, <code>--with-docdir</code>,
    <code>--with-pdfdir</code>, and <code>--with-htmldir</code> switches are
    not used any more.  Instead, you can now use <code>--datarootdir</code>,
    <code>--docdir</code>, <code>--htmldir</code>, and <code>--pdfdir</code>.
    The default installation directories have changed as follows according to
    the GNU Coding Standards:

    <table>
      <tbody>
	<tr>
	  <td>datarootdir</td>
	  <td>read-only architecture-independent data root [PREFIX/share]</td>
	</tr>
	<tr>
	  <td>localedir</td>
	  <td>locale-specific message catalogs [DATAROOTDIR/locale]</td>
	</tr>
	<tr>
	  <td>docdir</td>
	  <td>documentation root [DATAROOTDIR/doc/PACKAGE]</td>
	</tr>
	<tr>
	  <td>htmldir</td>
	  <td>html documentation [DOCDIR]</td>
	</tr>
	<tr>
	  <td>dvidir</td>
	  <td>dvi documentation [DOCDIR]</td>
	</tr>
	<tr>
	  <td>pdfdir</td>
	  <td>pdf documentation [DOCDIR]</td>
	</tr>
	<tr>
	  <td>psdir</td>
	  <td>ps documentation [DOCDIR]</td>
	</tr>
      </tbody>
    </table>

    The following variables have new default values:

    <table>
      <tbody>
	<tr>
	  <td>datadir</td>
	  <td>read-only architecture-independent data [DATAROOTDIR]</td>
	</tr>
	<tr>
	  <td>infodir</td>
	  <td>info documentation [DATAROOTDIR/info]</td>
	</tr>
	<tr>
	  <td>mandir</td>
	  <td>man documentation [DATAROOTDIR/man]</td>
	</tr>
      </tbody>
    </table>
    </li>
  </ul>

<h2 id="GCC4.5.1">GCC 4.5.1</h2>

<p>This is the <a href="https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=4.5.1">list
of problem reports (PRs)</a> from GCC's bug tracking system that are
known to be fixed in the 4.5.1 release. This list might not be
complete (that is, it is possible that some PRs that have been fixed
are not listed here).</p>

<h3>All languages</h3>
  <ul>
    <li><p>GCC's new link-time optimizer (<code><a
    href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801"
    >-flto</a></code>) now also works on a few non-ELF targets:</p>

    <ul>
      <li>Cygwin (*-cygwin*)</li>
      <li>MinGW (*-mingw*)</li>
      <li>Darwin on x86-64 (x86_64-apple-darwin*)</li>
    </ul>

    <p>LTO is not enabled by default for these targets.  To enable LTO,
    you should configure with the <code>--enable-lto</code> option.</p></li>
  </ul>

<h2 id="GCC4.5.2">GCC 4.5.2</h2>

<p>This is the <a href="https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=4.5.2">list
of problem reports (PRs)</a> from GCC's bug tracking system that are
known to be fixed in the 4.5.2 release. This list might not be
complete (that is, it is possible that some PRs that have been fixed
are not listed here).</p>

<h2 id="GCC4.5.3">GCC 4.5.3</h2>

<p>This is the <a href="https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=4.5.3">list
of problem reports (PRs)</a> from GCC's bug tracking system that are
known to be fixed in the 4.5.3 release. This list might not be
complete (that is, it is possible that some PRs that have been fixed
are not listed here).</p>

<p>On the PowerPC compiler, the Altivec builtin functions <code>vec_ld</code>
and <code>vec_st</code> have been modified to generate the Altivec memory
instructions <code>LVX</code> and <code>STVX</code>, even if the
<code>-mvsx</code> option is used.  In the initial GCC 4.5 release, these
builtin functions were changed to generate VSX memory reference instructions
instead of Altivec memory instructions, but there are differences between the
two instructions.  If the VSX instruction set is available, you can now use the
new builtin functions <code>vec_vsx_ld</code> and <code>vec_vsx_st</code> which
always generates the VSX memory instructions.</p>

<h2 id="GCC4.5.4">GCC 4.5.4</h2>

<p>This is the <a href="https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=4.5.4">list
of problem reports (PRs)</a> from GCC's bug tracking system that are
known to be fixed in the 4.5.4 release. This list might not be
complete (that is, it is possible that some PRs that have been fixed
are not listed here).</p>


</body>
</html>
